package com.cenntro.common.model.vo;

import java.util.List;

import com.google.common.collect.Lists;

/**
 * 
 * @author Administrator
 * treeVO 转换工具类
 * 
 */
public abstract class TreeUtil<T> {

    protected List<TreeVO> treeList = Lists.newArrayList();
	/**
	 * 组装树
	 * @param pnode 父节点 
	 * @param perms 需要组装的权限
	 * @param tree  组装完成的树
	 * @return
	 */
    public List<TreeVO> toTree(TreeVO pnode, List<T> perms){
        for (int i = 0; i < perms.size(); i++) {
		    T e = perms.get(i);
			TreeVO treeVO = getTreeVO();
			this.setField(e, treeVO);
			if(isRootId(e, pnode)){
				treeVO.setRootId(getRootId(e, pnode));
				treeVO.setPid(0);
				treeVO.setLevel(0);
				treeVO.setChildren(com.google.common.collect.Lists.newArrayList());
				treeVO.setLeaf(Boolean.TRUE);
				treeList.add(treeVO);
				perms.remove(e);
				i --;
				toTree(treeVO, perms);
			}else {
			    if (pnode == null){
			        continue;
			    }
				if(isParentId(e, pnode)){
					if(pnode.getChildren() == null){
						pnode.setChildren(Lists.newArrayList());
					}
					pnode.getChildren().add(treeVO);
					pnode.setLeaf(Boolean.FALSE);
					treeVO.setRootId(pnode.getRootId());
					treeVO.setPid(pnode.getId());
					treeVO.setLevel(pnode.getLevel() +1);
					treeVO.setLeaf(Boolean.TRUE);
					perms.remove(e);
					i--;
					toTree(treeVO, perms);
				}
			};
		}
		return treeList;
	}
	/**
	 * 取到跟节点id
	 * @param e 
	 * @param pnode 上级节点
	 * @return
	 */
	public abstract String getRootId(T e, TreeVO pNode);
	/**
	 * 判断是否是父节点
	 * @param e
	 * @param pnode 上级节点
	 * @return
	 */
	public abstract boolean isParentId(T e, TreeVO pNode); 
	/**
	 * 判断是否是根节点
	 * @param e
	 * @param pnode 上级节点
	 * @return
	 */
	public abstract boolean isRootId(T e, TreeVO pNode); 
	
	/**置其他属性
	 * 设置field值 
	 * id,name 必须实现
	 * */
	public abstract void setField(T e, TreeVO treeVO);
	/**
	 * 创建每一个treeVo
	 * @return
	 */
	protected TreeVO getTreeVO() {
        return new TreeVO();
    }
}
